package com.thread;

import org.junit.Test;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * 测试lock 接口
 *
 *多线程的实现方法
 * 1-继承Thread类
 * 在java.lang包中定义, 继承Thread类必须重写run()方法。
 * 然后通过start()方法去启动线程
 *
 * 2-实现Runnable接口
 * 实现Runnable接口必须重写其run方法。
 * 将Runnable作为Thread类的参数，然后通过Thread的start方法来创建一个新线程来执行该子任务
 *
 * Thread类是实现了Runnable接口的
 *
 *
 * 多线程的状态
 * 创建（new）状态: 准备好了一个多线程的对象
 * 就绪（runnable）状态: 调用了start()方法, 等待CPU进行调度
 * 运行（running）状态: 执行run()方法
 * 阻塞（blocked）状态: 暂时停止执行, 可能将资源交给其它线程使用
 * 终止（dead）状态: 线程销毁
 *
 *
 * @author Conceit
 * 2018/4/19 增加方法
 * @since 1.0.0, 2018/4/19
 */
public class TestThreadLock {

    //定义共享变量
    private static int count=100;

    /**
     * @Description: 定义lock
     * @author: conceit
     * @Date: 2018/8/27  9:59
     */
    private Lock lock=new ReentrantLock();


    /**
     * 方法入口
     */
    @org.junit.Test
    public void ticket() throws InterruptedException {

        Runnable nonuserRunnable=()->{
            while(count>0){
                if(count>0){

                    lock.lock();
                    System.out.println(Thread.currentThread().getName()+"售出第"+count+"张票");
                    count--;
                    lock.unlock();

                }
            }

        };

        //run方法中只是定义需要执行的任务，如果调用run方法，即相当于在主线程中执行run方法，跟普通的方法调用没有任何区别，此时并不会创建一个新的线程来执行定义的任务。
        //输出实例-main售出第99张票
        new Thread(nonuserRunnable,"第一个窗口").start();
        new Thread(nonuserRunnable,"第二个窗口").start();



        //Thread.currentThread().join();
    }

    /**
     * 未使用线程锁
     */
    public void nonuserThreadLock(){


    }

    /**
     * 使用线程锁
     */
    public void UseThreadLock(){
        new Thread().start();
    }

    public class Test implements Runnable{

        @Override
        public void run() {

        }
    }


}
